package com.kun.rental.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kun.rental.entity.Dept;
import com.kun.rental.entity.Permission;
import com.kun.rental.entity.User;
import com.kun.rental.mapper.PermissionMapper;
import com.kun.rental.mapper.UserMapper;
import com.kun.rental.service.IPermissionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kun.rental.utils.DeptTreeUtils;
import com.kun.rental.utils.PermissionTreeUtils;
import com.kun.rental.utils.RouteTreeUtils;
import com.kun.rental.vo.RolePermissionVo;
import com.kun.rental.vo.RouteVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ikun
 * @since 2024-07-04
 */
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements IPermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private UserMapper userMapper;


    /**
     * 根据用户ID查询权限列表。
     * @param userId 用户的ID，作为查询条件，用于精确匹配用户权限。
     * @return 返回一个权限列表，包含用户所有权限信息。如果用户没有权限，则列表为空。
     */
    @Override
    public List<Permission> selectPermissionListByUserId(Integer userId) {
        return baseMapper.selectPermissionListByUserId(userId);
    }

    /**
     * 查询菜单列表。
     * @return
     */
    @Override
    public List<Permission> selectList() {
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("order_num");
        List<Permission> list = permissionMapper.selectList(queryWrapper);
        return PermissionTreeUtils.buildMenuTree(list,0);
    }

    /**
     * 构建权限菜单树。
     * 本方法通过查询所有不为类型2的权限信息，并按照顺序编号升序排列，然后构建一个包含所有权限的树结构。
     * 树结构以跟目录开始，跟目录的ID为0，父ID为-1。
     * @return 返回构建好的权限菜单树列表。
     */
    @Override
    public List<Permission> selectTree() {
        // 创建查询条件，排除权限类型为2的权限
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        queryWrapper.ne("permission_type", 2);
        // 按照顺序编号升序排列查询结果
        queryWrapper.orderByAsc("order_num");
        // 查询满足条件的所有权限
        List<Permission> list = permissionMapper.selectList(queryWrapper);

        // 创建跟目录权限项，ID为0，父ID为-1，标签为"跟目录"
        Permission permission = new Permission();
        permission.setId(0).setPid(-1).setPermissionLable("根目录");
        // 将跟目录添加到权限列表中
        list.add(permission);

        // 调用工具类方法，构建权限菜单树，根节点ID为-1
        return PermissionTreeUtils.buildMenuTree(list,-1);
    }


    /**
     * 判断是否有子菜单。
     * @param id
     * @return
     */
    @Override
    public boolean hasChildren(Integer id) {
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("pid", id);
        return baseMapper.selectCount(queryWrapper) > 0;
    }


    /**
     * 根据用户ID和角色ID查询权限菜单树。
     * @param userId
     * @param roleId
     * @return
     */
    @Override
    public RolePermissionVo selectPermissionTree(Integer userId, Integer roleId) {
        User user = userMapper.selectById(userId);
        List<Permission> list = null;
        // 判断用户是否为管理员，管理员查询所有权限，非管理员查询个人权限
        if (user != null && user.getIsAdmin() == 1) {
            list = baseMapper.selectList(null);
        } else {
            list = baseMapper.selectPermissionListByUserId(userId);
        }
        // 将权限列表构建为树形结构
        List<Permission> permissionList = PermissionTreeUtils.buildMenuTree(list, 0);
        // 查询角色已有的权限
        List<Permission> rolePermissionList = baseMapper.selectPermissionListByRoleId(roleId);
        // 找出用户权限中与角色权限的交集
        List<Permission> newList=new ArrayList<>(list);
        List<Integer> ids= new ArrayList<>(list.stream().map(Permission::getId).toList());
        List<Integer> ids1=rolePermissionList.stream().map(Permission::getId).toList();
        ids.retainAll(ids1);

        Object[] array = ids.toArray();
        // 构建角色权限视图对象并返回
        RolePermissionVo rolePermissionVo=new RolePermissionVo();
        rolePermissionVo.setCheckedList(array).setPermissionList(permissionList);
        return rolePermissionVo;

    }
}
